package collection;


import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * JDK5推出时推出了一个新特性：增强型for循环
 * 也称为新循环，可以用相同的语法遍历集合或数组
 * 注意：新循环仅用来遍历集合或数组，不取代传统循环的工作
 * 语法：
 * for(元素类型 变量名 ： 集合或数组){
 *     ...
 * }
 *
 */
public class NewForDemo {
    public static void main(String[] args) {
        String[] array = {"one","two","three","four","five"};
        for (int i = 0; i < array.length; i++) {
            System.out.print(array[i]+"\t");
        }
        System.out.println();
        //新循环会被编译器改为传统的for循环遍历数组
        for (String str : array) {
            System.out.print(str+"\t");
        }

        /*
            JDK5之后推出的另一个特性：泛型
            泛型也成为参数化类型，允许我们在使用一个类时指定该类中某个属性的类型
            方法参数或返回值的类型，使得我们使用这个类更方便
            泛型在集合中广泛使用，用来指定集合中的元素类型，当我们不指定泛型的实际
            类型时，则使用默认的原型Object.
         */
        //Collection<E>集合定义时指定了一个泛型，这里使用时指定E为String
        Collection<String> c = new ArrayList<>();
        //add(E e) add方法的参数的类型就是集合使用的泛型
        c.add("一"); //指定泛型后，编译器会检查实参是否符合泛型要求
        c.add("二");
        c.add("三");
        c.add("四");
        c.add("五");
        //c.add(123);//类型不匹配,编译不通过
        //遍历时可以直接用泛型指定的类型接收元素，无需再手动造型
       for (String str : c){ //编译器会补充造型代码
           System.out.println(str);
       }

       //新循环遍历集合就是迭代器，编译器会改成迭代器遍历，如下
        //迭代器也可以指定泛型,只要与其遍历的集合指定的泛型一致即可
       Iterator<String> it = c.iterator();
       while (it.hasNext()){
           String o = it.next(); //获取元素时无需再手动造型
           it.remove();
       }
    }
}
